
/*
*Pool Public Licence version 0.1 or later
*Released on 20th April 2008.
*Any voilations can be repoted at paritosh@wikiocean.net
*What is treated as voilations can be found at www.wikiocean.net/ppl1-voilations* 
******************************************************************************
* The contents of this file are subject Affero GPL v3 and later with additional conditions.
* The additional conditions are to be considered as part of the Affero GPL v3 and later.
* The additional conditions will supersede the Affero GPLv3 and later in case of conflict.
* ("License"); You may not use this file except in compliance with the License
* You may obtain a copy of the License at http://www.gnu.org/licenses/agpl.html
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
* The Initial Developer of the Original Code is Paritosh Pungaliya.
* created by Paritosh Pungaliya are Copyright (C) Paritosh Pungaliya; All Rights Reserved.
* Contributions are Copyright (C) 2001-2008 Paritosh Pungaliya.

* Objective of the additional terms (license) 
* 1) Is to extend the software freedom to freedom to work.
* 2) To ensure that knowledge is free from monopoly of agencie(s).
* 3) To avoid a situation where big corporates or investors can buy out free software groups and companies and then start milking the communities built around it.
* (this trend can be seen how the openness changes in companies that get Venture Capital funding.)
* (if you agree to this logic I invite you to our group to work together)

* Additional conditions
*  0) Source code will also include
* 	a) data dictionaries, data ontologies which are used to alter the behavior of code or to control           the features of application.
* 	b) Any code generated or derived automatically or manually from this code or logic
*  1) The revenue generated by deploying, implementing , selling services and other activities
*  	 based on this source code should be shared 100%, between the people working on it.
*  2) Capital invested should be given only fixed rate of return or linked to revenue/surplus growth for limited time.
*  3) People working on the project should always have an option to replace the capital provider in full or part with lower cost capital.
*  4) Their should not be any ownership which can be sold as a claim on future profit to be generated from the work of people working on the code.
*  5) Brand thus generated should belong to the group.
*  6) For old and new members revenue sharing should be equal for same work equivalent.
*  7) The share of revenue should be decided by bidding for work before allocation of work within the group.
*  8) Before bidding various method of measuring the work should be clearly defined and published in public domain. Any change in process should also be publised in public domain imediately.
*  9) All data related to to revenue sharing should be published as and when generated in public domain.
*  10) For group of people having size more than 10 people will have to make it open online for others to participate in bids. 
*  11) All people involved in related and sub project will be treated as a group.
*  12) Once this license is being used for a certain code then all and any other software services being provided by the group should complusorilly come under 100% revenue sharing.
*  13) Cross subsidization should not happen under this revenue share, no additional benefit should be drawn from the people, by the employing agency.
*  14) Any position or knowledge or legal structure created relating to people working on code, which adversely affects the spirit of 100% revenue share will be treated as a violation.
*  15) Revenue sharing defined.
*     a) includes direct revenue and also intangible gains like brand, and organization.
*     b) No personal judgment should be involved in judging the distribution of revenue.It has to be pre-defined formula based.
*     c)100% of revenue should be shared before expenses and recievers should have control over what expenses to incur.
*     d)For the work done in any month by contributing group member, working on any project can be given revenue share from the work done by the group, for a maximum of 18 months after that month.
*     e)Revenue should be apportioned to the month in which work is done and not when received.
*  The group fulfilling the above conditions also has to be a wiki ecosystem further defined in www.wekosystem.org or read about Wekosystem at www.wikiocean.net

*  ******************************************************************************
*/  
package property;


import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Stack;
import java.util.Vector;

import pool.bean.Master_table_Bean;
import pool.bean.Property_details_Bean;

import control.RequestParameter;
import utility.ConvertToLower;
import utility.Index;
import utility.Splitstring;
import database.RecordSearch;
import dbmanager.ChekInMaster;
import dbmanager.Column;
import dbmanager.DBManager;
import dbmanager.GetIdName;

public class Sequence  
{
  private DBManager database;
  private  String SYSTEMUSER="+911234567891";
  private GetIdName gid;
  private String KEY="key";
  private String SEQUENCE="sequence";
  private String REQUEST="request";
  private String MESSAGE="message";
  private String ID="id"; 
  String RESPONSES="responses";
  public String msg="";
  public String keyword="";
  public String password;
  
  public void setDbmanager(DBManager database)
  {
	  this.database = database;
	  gid = new GetIdName(database);
	  KEY = gid.getId(KEY);
	  SEQUENCE = gid.getId(SEQUENCE);
	  REQUEST = gid.getId(REQUEST);
	  ID= gid.getId(ID);
  }
  
  
  public Stack<Object> getResult(String request,String username)
  {  
		  Splitstring splitstring = new Splitstring();
		  Stack<Object> stack =new Stack<Object>();
		  try 
		  {
			password = request.substring(Index.lastIndexOf(request, "#"), request.length());
			 
		  }
		  catch (Exception e) 
		  {
			stack.add("password is not present");
			return stack;
		  }
		
		 
		
		  int opening=0,closing=0;
		  for(int i=1;i<request.length();i++)
		  {
			  if(request.contains("[") || request.contains("]"))
			  {
				  char ch[]=request.toCharArray();
				  for(int j=0;j<ch.length;j++)
				  {
					  if(ch[j]=='[')
						  opening++;
					  else if(ch[j]==']')
						  closing++;
				  }
			  }
			  if(opening!=closing)
			  {  
				stack.add("Error in input");
				return stack;
			  }	   
		  }  
		Hashtable<Object, Object> table = new Hashtable<Object, Object>();
		 while(request.indexOf("[")!=-1)
		 {
			 int lastindexopen=Index.lastIndexOf(request,"[");
			 int firstindexclose=Index.lastIndexOf(request,"]");
			 String subrequest= request.substring(lastindexopen+1, firstindexclose);
			 String splitmsg[] =splitstring.splitStringOnAllSpchar(subrequest);
			 table.clear();
			 table.putAll(expandkey(splitmsg));
			 String message =table.get("message").toString();
			 if(Index.indexOf(message,"#")==-1)
				 message =message +"#"+password;
			 stack.push(message);
			 String mastername="";
			 if(table.containsKey("mastername"))
			       mastername = table.get("mastername").toString();
			 else
			 {
				 RecordSearch rs =new RecordSearch(database);
				 Hashtable<Object, Object> condition = new Hashtable<Object, Object>();
				 condition.put("mid", gid.getId(splitmsg[0]));
				 condition.put("pid", ID);
				 rs.setConditionMap(condition);
				 String buffer[] = rs.getArrayFromResultSet();
				 RequestParameter reqParam= new RequestParameter();
				 reqParam.setUsername("+911234567891");
				 reqParam.setPassword("891");
				 reqParam.setMessage("System Message");
				 reqParam.setRequest("master_table");
				 reqParam.setProcess("add");
				 Hashtable<Object,Object> hasht = new Hashtable<Object, Object>();
				 hasht.put("mid", splitmsg[0]);
				 hasht.put("pid", "id");
				 hasht.put("pv", "1");
				 Vector<Object> PropertyVector= new Vector<Object>();
				 PropertyVector.add(hasht);
				   
				 if(buffer.length==0)
				 {
						ChekInMaster ch =new  ChekInMaster(database);
						if(ch.isInMaster(splitmsg[0])==false)
						{
							Master_table_Bean bean =new Master_table_Bean();
							bean.setDBManager(database);
							bean.setReqParam(reqParam);
							bean.setPropertyVector(PropertyVector);
							Hashtable<Object,Object> masterhash = new Hashtable<Object, Object>();
							masterhash.put("name",splitmsg[0]);
							bean.setHashtable(masterhash);
							bean.insert();
						}
						else
						{
							Property_details_Bean bean =new Property_details_Bean();
							bean.setDBManager(database);
							bean.setReqParam(reqParam);
							bean.setPropertyVector(PropertyVector);
							bean.setId(splitmsg[0]);
							bean.insert();
						}	
				 }
				 else
				 { 
					synchronized(this) 
					{
					 String splitbuffer[]= buffer[0].split("\t");
					 String id=splitbuffer[Column.pid_index-1];
					 if(id.equals("0"))
						 id = splitbuffer[Column.vt_index-1];
					 else
						 id = gid.getItem(id);
					hasht.put("pid", id);
					reqParam.setProcess("mod");
					Property_details_Bean bean =new Property_details_Bean();
					bean.setDBManager(database);
					bean.setReqParam(reqParam);
					bean.setNewHashtable(hasht);
					bean.setId(splitmsg[0]);
					bean.insert();
					}
					
				 }	 
			 }
			 mastername = "," +mastername;
			 request =request.replace("["+subrequest+"]", mastername);
		 }
		 try {
			table.putAll(expandkey(splitstring.splitStringOnAllSpchar(request)));
			String message=table.get("message").toString();
			if(Index.indexOf(message,"#")==-1)
				 message =message +"#"+password;
			stack.push(message);
			System.out.println(request);
			Enumeration<Object> enumeration =stack.elements();
			 
			 for(int i=0;i<stack.size();i++)
			 {
				 System.out.println(stack.get(i));
			 }
		} catch (Exception e) 
		{
			e.printStackTrace();
		}
	  
	return stack;
  }
  
  
  public Hashtable<Object,Object> expandkey(String splitmsg[])
  {
	  Hashtable<Object, Object> resulttable =new Hashtable<Object, Object>();
	  String msg = "";
	  try
	  {
		   this.keyword = splitmsg[0];
		  Hashtable<Object, Object> Propertymap=new Hashtable<Object, Object>();
		  Hashtable<Object, Object> Sequencemap=new Hashtable<Object, Object>();
		  Hashtable<Object, Object> Replacermap=new Hashtable<Object, Object>();
		  Hashtable<Object, Object> Condition=new Hashtable<Object, Object>();
		  Condition.put("pid", KEY);
		  String pv = gid.getId(splitmsg[0]);
		  if(!pv.equals("0"))
			  Condition.put("pv", pv);
		  else
			  Condition.put("vt", splitmsg[0]);
		  Condition.put("td","null");
		  RecordSearch record =new RecordSearch(database);
		  record.setConditionMap(Condition);
		  String line[]= record.getArrayFromResultSet();
		  Condition.clear();
		  String masterid="";
		  for(int i=0;i<line.length;i++)
		  {
			  String split[] = line[i].split("\t");
			  Condition.put("mid", split[Column.mid_index-1]);
			  masterid = split[Column.mid_index-1];
			  record.setConditionMap(Condition);
			  String result[]=record.getArrayFromResultSet();
			  for(int j=0;j<result.length;j++)
			  {
				  String splitresult[]=result[j].split("\t");
				  String value=splitresult[Column.pv_index-1];
				  if(value.equals("0"))
					  value=splitresult[Column.vt_index-1];
				  Propertymap.put(splitresult[Column.pid_index-1],value);
			  }
		  }
		  if(Propertymap.containsKey(SEQUENCE))
		  {
			  Order order = new Order(database);
			  Sequencemap.putAll(order.getSequences(masterid));
		  }
		  Hashtable<Object, Object> temp =new Hashtable<Object, Object>();
		  for(int i=0;i<Sequencemap.size();i++)
		  {
			  try {
				String property=Sequencemap.get(Integer.toString(i+1)).toString();
				  temp.put(property, splitmsg[i+1]);
			} catch (Exception e) 
			{
				e.printStackTrace();
			}
		  }
		  Sequencemap.clear();
		  Sequencemap.putAll(temp);
		  if(Propertymap.containsKey(REQUEST))
		  {
			  String replacerobjet=Propertymap.get(REQUEST).toString();
			  Condition.put("mid",replacerobjet);
			  record.setConditionMap(Condition);
			  line=record.getArrayFromResultSet();
			  for(int i=0;i<line.length;i++)
			  {
				  String splitline[] = line[i].split("\t");
				  String value =splitline[Column.pv_index-1];
				  if(value.equals("0"))
					  value =splitline[Column.vt_index-1];
				  else
					  value = gid.getItem(value);
				  Replacermap.put(gid.getItem(splitline[Column.pid_index-1]), value);
			  }
		  } 
		 
		  msg=Replacermap.get(MESSAGE).toString().toLowerCase();
		  Enumeration<Object> enumer = Sequencemap.keys();
		  Replacermap= ConvertToLower.convertHashKey(Replacermap);
		  Sequencemap = ConvertToLower.convertHashKey(Sequencemap);
		  if(Sequencemap.containsKey("mastername"))
			  resulttable.put("mastername", Sequencemap.get("mastername"));
		  while(enumer.hasMoreElements())
		  {
			  try 
			  {
				String key = enumer.nextElement().toString();
				String value = Sequencemap.get(key).toString().toLowerCase();
				String spchar = Replacermap.get(key).toString();
				
				if(value.length()>0)
				{
				//msg = msg.replace(spchar, value);
			    msg = msg.replace(spchar, value);   			
				Replacermap.remove(key);
				}
			 } 
			  catch (Exception e) 
			  {
				e.printStackTrace();
			 }
		  }
		  Replacermap.remove("type");
		  Replacermap.remove("message");
		  enumer = Replacermap.keys();
		  String NO="\""+ "no$" +"\"";
		  while(enumer.hasMoreElements())
		  {
			  String key = enumer.nextElement().toString();
			  String spchar = Replacermap.get(key).toString();
			  msg = msg.replace(spchar,NO);
		  }
		 // msg = msg  +  password; 
		  resulttable.put("message",msg);
	  }
	  catch (Exception e) 
	  {
		  
		e.printStackTrace();
	 }
	  return resulttable;
  }
  
  public String getReponses(String keyword,Hashtable<Object, Object> Property)
  { 
	  RESPONSES = gid.getId(RESPONSES);
	  Hashtable<Object, Object> Condition=new Hashtable<Object, Object>();
	  Hashtable<Object, Object> Propertymap=new Hashtable<Object, Object>();
	  RecordSearch record =new RecordSearch(database);
	  String pv=gid.getId(keyword);
	  if(!pv.equals("0"))
		  Condition.put("pv", pv);
	  else
		  Condition.put("vt", pv);
	  Condition.put("td", "null");
	  record.setConditionMap(Condition);
	  String line[]= record.getArrayFromResultSet();
	  Condition.clear();
	  for(int i=0;i<line.length;i++)
	  {
		  String split[] = line[i].split("\t");
		  Condition.put("mid", split[Column.mid_index-1]);
		  Condition.put("pid", RESPONSES);
		  record.setConditionMap(Condition);
		  String result[]=record.getArrayFromResultSet();
		  Condition.clear();
		  for(int j=0;j<result.length;j++)
		  {
			  String splitresult[]=result[j].split("\t");
			  Condition.put("mid",splitresult[Column.pv_index-1]);
			  record.setConditionMap(Condition);
			  String finalresult[]=record.getArrayFromResultSet();
			  for(int k=0;k<finalresult.length;k++)
			  {
				String splitfinalresult[]=finalresult[k].split("\t");  
				String value= splitfinalresult[Column.pv_index-1];
				if(value.equals("0"))
				  value=splitfinalresult[Column.vt_index-1];
				Propertymap.put(gid.getItem(splitfinalresult[Column.pid_index-1]),value);
			  }
		  }
		  
		  
	  }
	  Propertymap =ConvertToLower.convertHashKey(Propertymap);
	  Property =ConvertToLower.convertHashKey(Property);
	  String msg=Propertymap.get(MESSAGE).toString();
	  Enumeration<Object> enumer = Property.keys();
	  while(enumer.hasMoreElements())
	  {
		  String key = enumer.nextElement().toString();
		  if(Propertymap.containsKey(key))
		  {
			  msg = msg.replace(Propertymap.get(key).toString(),Property.get(key).toString());
		  }
	  }
	  return msg;
  }
  
  
  public static void main(String[] args) 
  {
    Sequence seq =new Sequence();
    DBManager database = new DBManager();
    database.getConnect();
    seq.setDbmanager(database);
    System.out.print(seq.getResult("buyrate [mrprate ada 13 12#891", ""));
  }
  
}
